﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Medico
    {
        RzCorportativo.DataAccess.Medico model;
        public bool IsNew { get { return this.MedicoId == 0; } }
        public int MedicoId { get; set; }
        public string CRM { get; set; }
        public short Especialidade { get; set; }
        public Especialidade EspecialidadeMedico { get; set; }
        public int PessoaId { get; set; }
        public Usuario Pessoa { get; set; }

        public Medico()
        {
            this.Pessoa = new Usuario();
            this.EspecialidadeMedico = new Especialidade();
        }

        public static Medico CreateInstace(int medicoId)
        {
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            var p = db.Medico.Where(w => w.MeidicoId == medicoId).FirstOrDefault();
            Medico pItem = new Medico();
            if (p != null)
                pItem = pItem.CreateMedico(p);
            return pItem;
        }

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.Pessoa.UsuarioId > 0 && entity.Medico.Any(any => any.PessoaId == this.Pessoa.UsuarioId && (this.IsNew || this.MedicoId != any.MeidicoId)))
                {
                    throw new Exception("Este usuário já está cadastrado como um funcionário no sistema");
                }
                bool resultPessoa = this.Pessoa.Salvar();
                if (!resultPessoa)
                    throw new Exception("Falha ao salvar pessoa");
                this.PessoaId = this.Pessoa.UsuarioId;
                if (this.IsNew)
                    this.model = this.Insert(entity);
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                throw ex;
            }).OnSuccess(() =>
            {
                @result = true;
                this.MedicoId = this.model.MeidicoId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.Medico Insert(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToMedico(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.Medico Update(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.Medico CreateModel(RZCorporativoEntities entity)
        {
            RzCorportativo.DataAccess.Medico medico = new RzCorportativo.DataAccess.Medico();
            if (!this.IsNew)
            {
                medico = entity.Medico.Where(w => w.MeidicoId == this.MedicoId).FirstOrDefault();
                if (medico == null)
                    throw new Exception("Código inválido");
            }
            medico.MeidicoId = this.MedicoId;
            medico.CRM = this.CRM;
            medico.PessoaId = this.PessoaId;
            medico.TipoConsultaId = this.Especialidade;
            return medico;
        }

        internal Medico CreateMedico(RzCorportativo.DataAccess.Medico item)
        {
            Medico medico = new Medico();
            medico.MedicoId = item.MeidicoId;
            medico.CRM = item.CRM;
            medico.PessoaId = item.PessoaId;
            medico.Especialidade = item.TipoConsultaId;
            if (!0.Equals(medico.PessoaId))
                medico.Pessoa = Usuario.CreateInstace(medico.PessoaId);
            else
                medico = new Medico();
            if (!0.Equals(medico.Especialidade))
                medico.EspecialidadeMedico = Lib.Especialidade.CreateInstance(medico.Especialidade);
            else
                medico.EspecialidadeMedico = new Especialidade();
            return medico;
        }

        public static List<Medico> Listar(Medico medico)
        {
            if (medico == null)
                medico = new Medico();
            List<Medico> pacientes = new List<Medico>();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            pacientes = db.Medico.Where(w =>
                    ((medico.MedicoId == 0) || (medico.MedicoId == w.MeidicoId)) &&
                    ((medico.PessoaId == 0) || (medico.PessoaId == w.PessoaId)) &&
                    ((medico.Pessoa.Nome == null || medico.Pessoa.Nome == "") || (w.Pacientes.Nome.Contains(medico.Pessoa.Nome))) &&
                    ((medico.Pessoa.Cpf == null || medico.Pessoa.Cpf == "") || (medico.Pessoa.Cpf == w.Pacientes.Cpf)) &&
                    ((medico.CRM == null || medico.CRM == "") || (medico.CRM == w.CRM)) &&
                    ((medico.Especialidade == 0) || (medico.Especialidade == w.TipoConsultaId))
                ).ToList().Select(s => medico.CreateMedico(s)).ToList();
            return pacientes;
        }
    }
}
